import { LinkedList, Node } from "./linked_list.js";
class DoublyNode extends Node {
    constructor(element) {
        super(element);
        this.prev = null;
    }
}
export class DoublyLinkedList extends LinkedList {
    constructor() {
        super();
        this.tail = null;
    }
    // append(element)：向列表尾部添加一个新的项
    append(element) {
        // 1.根据element创建Node对象
        const newNode = new DoublyNode(element);
        // 追加元素
        if (this.head === null) {
            // 如果链表中没有节点，头部和尾部都为新建节点
            // 理解：当前没有，就是1
            this.head = newNode;
            this.tail = newNode;
        } else {
            // 查询最后一个节点，tail本身就是最后一个节点，所以不用一个一个去找
            // 理解：1的下一个是2；2的上一个是1；1直接变为2
            this.tail.next = newNode; // 先将新节点追加到最后一个节点
            newNode.prev = this.tail; // 然后新节点的上一个最后一个节点
            this.tail = newNode; // 最后修改最后一个节点就是新元素
        }
        this.length++
    }
    // inset(position, element)：向列表的特定位置插入一个新的项
    inset(position, element) {
        // 1.越界问题
        if (position < 0 || position > this.length) return false;
        // 2.新建节点
        const newNode = new DoublyNode(element);
        // 3.判断多种插入情况
        if (!position) {
            // A.position = 0 
            if (!this.head) {
                // 没有元素
                this.head = newNode;
                this.tail = newNode;
            } else {
                // 有元素
                newNode.next = this.head;
                this.head.prev = newNode;
                this.head = newNode;
            }
        } else if (position === this.length) {
            // B.position = length
            this.tail.next = newNode;
            newNode.prev = this.tail;
            this.tail = newNode;
        } else {
            // C.其他位置，比如 position = 2
            let current = this.head;
            let previous = null;
            let index = 0;
            // 找到当前节点和上一个节点
            while (index++ < position) {
                previous = current;
                current = current.next;
            }
            // 交换节点信息
            previous.next = newNode;
            newNode.prev = previous;
            newNode.next = current;
            current.prev = newNode;
        }
        this.length++;
        return true;
    }
    // get(position)：获取对应的位置
    // 因为此处的 get 方法和父类的 get 方法一样的，又是是继承，所以不需要重新
    // indexOf(element)：返回元素在列表中的索引。如果列表中没有该元素则返回-1。
    // 因为此处的 indexOf 方法和父类的 indexOf 方法一样的，又是是继承，所以不需要重新    
    // removeAt(position)：从列表的特定位置移除一项
    removeAt(position) {
        // 1.越界问题
        if (position < 0 || position > this.length - 1) return null;
        // 获取当前元素
        let current = this.head;
        // 2.根据不同情况删除元素
        if (position == 0) {
            // 开头
            if (!this.length) {
                // 只有一个
                this.head = null;
                this.tail = null;
            } else {
                // 多个
                this.head = this.head.next;
                this.head.prev = null;
            }
        } else if (position == this.length - 1) {
            // 结尾
            current = this.tail;
            this.tail.prev.next = null;
            this.tail = this.tail.prev;
        } else {
            // 中间
            let index = 0;
            let previous = null;
            while (index++ < position) {
                previous = current;
                current = current.next;
            }
            previous.next = current.next;
            current.next.prev = previous
        }
        this.length--
        return current.element;
    }
    // update(position, element)：修改某个位置的元素
    // remove(element)：从列表中移除一项
    // isEmpty()：如果链表中不包含任何元素，返回true，如果链表长度大于0则返回false
    // size()：返回链表包含的元素个数。与数组的length属性类似

}
